// object表示一个对象
let a :object;
a = {};
a=function(){};


// {} 用来指定对象中可以包含那些属性
// 语法：{属性名：属性值，属性名：属性值}；
// let b:{name:string,age:number};
// b ={name:'刘德华',age:18};


// 在属性后面加上？，表示可选择的
let b:{name:string,age?:number};
b = {name:"小红"}  //后面的age是可选择的可以有也可以没有

// let c:{name:string};
// c={name:'猪八戒',a:1,b:2}
 /*
  *报错后面的属性是多出来的
  *上述可以属性后面加？来设置位置属性，但是如果位置属性太多不合理
  *语法：[自定义属性名：类型]：属性（any）
  */
let c:{name:string,[propName:string]:any};
c={name:"小黄",age:18,gender:'男'}

/*
  设置函数结构的类型声明：
  语法：（形参：类型，形参：类型...)=>返回值
*/
let d:(a:number,b:number)=>number;
//  d=function(n1:string,n2:string):number{
//     return 10;
// }
 
//  数组类型
// string[] 表示字符串数组
let e:string[];
// e=['a','b','c',1,2]  //报错，只能是字符串

// 表示数字数组
// 写法一：类型[]
let f:number[];
f=[1,2,3];
// 写法二:Array<类型>
let g:Array<number>;
g=[1,2,3];

// 元组类型
/* 
  元组是固定长度的数组
  语法：[类型，类型，类型]
*/ 
let h:[string,number];
h:['hello',123]


/*
  enum 枚举
*/ 
// let i:{name:string,gender:string};
let i:{name:string,gender:0|1};
i={
    name:'孙悟空',
    gender:1//"male"
}
// console.log(i.gender==="男");
console.log(i.gender===1);

// 
enum Gender{
   Male=0,
   Female=1
}
let j:{name:string,gender:Gender};
j={
    name:"孙悟空",
    gender:Gender.Female
}
console.log(i.gender===Gender.Female)


//用&表示同时
let k:{name:string }&{age:number};
k={name:"孙悟空",age:18}

// 类型别名
type myType=1|2|3|4;
let m:myType
let L:myType
//  m=6;  报错



// 编译  tsc 04_types.ts